package cn.xiaopengstack.infrastructure.persistent.repository;

import cn.xiaopengstack.domain.tag.model.entity.CrowdTagsJobEntity;
import cn.xiaopengstack.domain.tag.repository.ITagRepository;
import cn.xiaopengstack.infrastructure.persistent.dao.ICrowdTagsDao;
import cn.xiaopengstack.infrastructure.persistent.dao.ICrowdTagsDetailDao;
import cn.xiaopengstack.infrastructure.persistent.dao.ICrowdTagsJobDao;
import cn.xiaopengstack.infrastructure.persistent.po.CrowdTagsDetail;
import cn.xiaopengstack.infrastructure.persistent.po.CrowdTagsJob;
import cn.xiaopengstack.infrastructure.persistent.redis.IRedisService;
import org.redisson.api.RBitSet;
import org.springframework.beans.BeanUtils;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.util.Date;
import java.util.Objects;

/**
 * @author jiangyangang
 */
@Repository
public class TagRepository implements ITagRepository {

    @Resource
    private ICrowdTagsJobDao crowdTagsJobDao;
    @Resource
    private ICrowdTagsDetailDao crowdTagsDetailDao;
    @Resource
    private ICrowdTagsDao crowdTagsDao;

    @Resource
    private IRedisService redisService;

    @Override
    public CrowdTagsJobEntity queryCrowdTagsJob(String tagId, String batchId) {

        CrowdTagsJob crowdTagsJob = crowdTagsJobDao.queryCrowdTagsJob(tagId, batchId);
        if (Objects.isNull(crowdTagsJob)) {
            return null;
        }

        CrowdTagsJobEntity crowdTagsJobEntity = new CrowdTagsJobEntity();
        BeanUtils.copyProperties(crowdTagsJob, crowdTagsJobEntity);

        return crowdTagsJobEntity;
    }

    @Override
    public void addCrowdTagsUser(String tagId, String userId) {
        CrowdTagsDetail crowdTagsDetail = new CrowdTagsDetail();
        crowdTagsDetail.setUserId(userId);
        crowdTagsDetail.setTagId(tagId);

        try {
            // 数据入库
            CrowdTagsDetail crowdTagsDetailInsert = new CrowdTagsDetail();
            crowdTagsDetailInsert.setCreateTime(new Date());
            crowdTagsDetailInsert.setUpdateTime(new Date());
            crowdTagsDetailInsert.setUserId(userId);
            crowdTagsDetailInsert.setTagId(tagId);
//            crowdTagsDetailDao.insertSelective(crowdTagsDetailInsert);

            // 加入bigmap集合
            RBitSet bitSet = redisService.getBitSet(tagId);
            boolean set = bitSet.set(redisService.getIndexFromUserId(userId), true);
            System.out.println(set);
        } catch (DuplicateKeyException e) {
            // 忽略主键冲突
        }

    }

    @Override
    public void updateCrowdTagsStatistics(String tagId, Integer tagNumber) {
        crowdTagsDao.updateByTagsStatistics(tagId, tagNumber);
    }

    @Override
    public boolean isTagCrowdRange(String tagId, String userId) {
        int indexFromUserId = redisService.getIndexFromUserId(userId);
        RBitSet bitSet = redisService.getBitSet(tagId);
        return bitSet.get(indexFromUserId);
    }
}
